﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace EstoqueUnifeiADO.Controles
{
    
    public partial class ctrlEntrarProduto : System.Web.UI.UserControl
    {
        public event EntrarProdutosHandler EntrarProdutos;
        public event EventHandler ProcessoConcluido;
        public event EventHandler Cancelou;
        
        public string DataSession { get { return this.ID + "Session"; } }
        public string VsGroupMain { get { return this.ClientID + "ValidationGroup"; } }

        private void AddError (string mensagemDeErro,string validationGroup)
        {
        
            this.Page.Validators.Add(new CustomValidator()
            {
                ErrorMessage = mensagemDeErro,
                ValidationGroup = validationGroup,
                Display = ValidatorDisplay.Dynamic,
                IsValid = false
            });



        }

        protected void Page_Load(object sender, EventArgs e)
        {
            vsMain.ValidationGroup = VsGroupMain;

            if(!IsPostBack)
                ViewState.Add(DataSession,new List<ProdQuant>());

        }

        protected void btnOK_Click(object sender, EventArgs e)
        {
            try
            {
                if (Convert.ToDecimal(tbQuantidade.Text) <= 0)
                    throw new Exception("Valor não permitido");

                List<ProdQuant> dsLista = ((List<ProdQuant>)ViewState[DataSession]);
                dsLista.Add(new ProdQuant()
                {
                    CodIndex = dsLista.Count,
                    CodProduto = Convert.ToInt32(ddlProduto.SelectedValue),
                    NomeProduto = ddlProduto.SelectedItem.Text,
                    Quantidade = decimal.Parse(tbQuantidade.Text)
                });

                GridView1.DataSource = dsLista;
                GridView1.DataBind();
            }
            catch (Exception ex)
            {
                AddError(string.Format("Ocorreu o seguinte erro ao tentar inserir o produto: {0}",
                    ex.Message), "vgEntrarProduto"); 
               
            }
            

        }

        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if(e.CommandName.Equals("Select")&&(e.CommandArgument.Equals("Del")))
            {
                List<ProdQuant> dslist = ViewState[DataSession] as List<ProdQuant>;
                dslist.Remove(dslist.Find(x=>x.CodIndex.Equals(Convert.ToInt32(GridView1.SelectedValue))));
                GridView1.DataSource = dslist;
                GridView1.DataBind();
            }

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (EntrarProdutos != null) 
            {
                if ((ViewState[DataSession] as List<ProdQuant>).Count < 1)
                    AddError("Você precisa adicionar produtos para executar o processo", VsGroupMain);
                else
                {
                    EntradaProdutoArgs args = new EntradaProdutoArgs(){
                        Observacao = tbObservacao.Text,
                        Produtos = (ViewState[DataSession] as List<ProdQuant>)
                    };

                    EntrarProdutos(this,args);
                    if (args.Cancelar)
                    {
                        this.AddError(args.MensagemDeErro, this.VsGroupMain);
                        return;
                    }
                    else if (ProcessoConcluido != null) ProcessoConcluido(this, EventArgs.Empty);

                }
            }
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            if (Cancelou != null) Cancelou(this, EventArgs.Empty);

        }

        protected void LimpaInsereItem()
        {
            tbQuantidade.Text = string.Empty;
            ddlProduto.SelectedIndex = ddlProduto.Items.IndexOf(ddlProduto.Items.FindByValue(string.Empty));
        }

        public void Clear()
        {
            (ViewState[DataSession] as List<ProdQuant>).Clear();
            GridView1.DataSource = null;
            GridView1.DataBind();
            tbObservacao.Text = string.Empty;
            LimpaInsereItem();
        }
    }
}